package serveurs;


import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Vector;

/**
 *  Client Access
 *
 *
 * @author Peloux Arnaud</a>
 * @version 1.0
 */
public class ClientAcces {
	GedServeur ged;
	DataOutputStream out;
	String requete,demande;
	ClientAcces(String requeteHTTP, GedServeur ged,DataOutputStream out){
		this.ged=ged;
		this.out = out;
		requete = requeteHTTP;
	} 
	
	public void extractionDemande(){
		
		//System.out.println(requete);
		

	} 
	
	public String resultatDemande(){
	
		//StringTokenizer st = new StringTokenizer(requete,"%20");
		String[] temp= requete.split("%20");
		System.out.println(requete);
		int st= 1, max= temp.length-1;
		String uid;
		

		if (temp[st].equalsIgnoreCase("get")){
			if (st+1<=max)st++;else return "0";		
			if (temp[st].equalsIgnoreCase("-user")){

				if (st+1<=max)st++;else return "0";	
				return ged.rechercheUidUtilisateur(temp[st]);
			}
			if (temp[st].equalsIgnoreCase("-uid")){
				//l'uid devient notre cookie de connexion
				
				if (st+1<=max)st++;else return "0";	
				uid=temp[st].toString(); //récupération de l'UID
				
				if (!uid.equals("0") ){ //vérification de l'uid
					// liste de toutes les GedClasses de l'utilisateur
					String[] tabTemp = ged.rechercheListUidGedClassesByUidProprietaire(uid);
					if (st+1<=max)st++;else return "0";	
					// récupération d'un GedDocument

					if(temp[st].equalsIgnoreCase("-doc")){
	
						if (st+1<=max)st++;else return "0";	
						//web
						
							if (temp[st]!=null & temp[st].endsWith(" HTTP/1.1")){
								
								temp[st]= temp[st].split(" HTTP/1.1")[0];
								for(int i=0;i<tabTemp.length;i++){

									GedClasses gedClassesTemp =ged.getGedClasse(tabTemp[i]);
									for (int j=0;j<gedClassesTemp.getnbDocs();j++){
										
										if (gedClassesTemp.getGedDocs(j).getNom().equalsIgnoreCase(temp[st])){
											
											envoiDonnees(temp[st]);
											
												return null;}
									}
								}}
						//client lourd
						for(int i=0;i<tabTemp.length;i++){
							GedClasses gedClassesTemp =ged.getGedClasse(tabTemp[i]);
							for (int j=0;j<gedClassesTemp.getnbDocs();j++){
								
								if (gedClassesTemp.getGedDocs(j).getNom().equalsIgnoreCase(temp[st])){
									
										return ged.base64EncodeFile(ged.getRacine()+temp[st]);}
							}
						}
					}
					
					
					if(temp[st].equalsIgnoreCase("-attr")){
						if (st+1<=max)st++;else return "0";	
						if(temp[st].equalsIgnoreCase("-classe")){
							if (st+1<=max)st++;else return "0";	
							GedClasses gedClasseTemp =ged.getGedClassefromName(temp[st]);
							if (gedClasseTemp != null){
							StringBuffer sb = new StringBuffer();
							for (int i=0; i<gedClasseTemp.getNbAttributs();i++)
								sb.append(gedClasseTemp.getNomAttributs(i) +" "+gedClasseTemp.getTypeAttributs(i)+"\n");
							return sb.toString();
							}
						}if(temp[st].equalsIgnoreCase("-doc")){
							StringBuffer sb = new StringBuffer();
							if (st+1<=max)st++;else return "0";	
							//String[] tabTempDocGed = ged.rechercheListGedDocumentsByUidProporietaire(uid);
							String[] tabTempGed = ged.rechercheListUidGedClassesByUidProprietaire(uid);
							for (int i=0; i<tabTempGed.length;i ++){
								GedClasses gedClasseTemp =ged.getGedClasse(tabTempGed[i]);
								for(int j=0; j<gedClasseTemp.getnbDocs();j++){
									System.out.println(gedClasseTemp.getGedDocs(j).getNom()+" "+temp[st]);
									if (gedClasseTemp.getGedDocs(j).getNom().equalsIgnoreCase(temp[st])){
										
										for(int k=0;k<gedClasseTemp.getNbAttributs();k++){
											
											sb.append(gedClasseTemp.getGedDocs(j).getAttribut(k).getAttribut()+"\n");
										}
									}
									
									
								}
									
							}
							return sb.toString();
						}
							
						
							
						
					}
				
					if(temp[st].equalsIgnoreCase("-list")){
						StringBuffer sb = new StringBuffer();
						if (st+1<=max)st++;else return "0";	
						if(temp[st].equalsIgnoreCase("doc")){
							// liste des noms des docs
							for(int i=0;i<tabTemp.length;i++){
								GedClasses gedClassesTemp =ged.getGedClasse(tabTemp[i]);
								for (int j=0;j<gedClassesTemp.getnbDocs();j++){
									sb.append(gedClassesTemp.getGedDocs(j).getNom()+"\n");
								}
								
							}
							return sb.toString();
						}
						if(temp[st].equalsIgnoreCase("Classe")){
							//liste des noms de classes
						
							for(int i=0;i<tabTemp.length;i++){
								GedClasses gedClassesTemp =ged.getGedClasse(tabTemp[i]);
									sb.append(gedClassesTemp.getName()+"\n");					
							}
							return sb.toString();
						}
						if(temp[st].equalsIgnoreCase("ClasseAttribut")){
							// liste les atributs
							for(int i=0;i<tabTemp.length;i++){
								GedClasses gedClassesTemp =ged.getGedClasse(tabTemp[i]);
									sb.append(gedClassesTemp.getName()+"\n");					
							}
							
						}
						if(temp[st].equalsIgnoreCase("users")){
							
							
							for(int i=0;i<ged.getNbUtilisateurs();i++){
								
									sb.append(ged.getUtilisateurs(i).getName()+"\n");					
							}
							return sb.toString();
						}
						if(temp[st].equalsIgnoreCase("ClasseAttribut")){
							
							
						}
						
					}
				
				}
			}
			
			
			
		}else if(temp[st].equalsIgnoreCase("del")){
			// Suppression
			if (st+1<=max)st++;else return "0";	
			
			if (temp[st].equalsIgnoreCase("-uid")){
				//l'uid devient notre cookie de connexion
				//System.out.println(requete);
				if (st+1<=max)st++;else return "0";	
				uid=temp[st].toString(); //récupération de l'UID
				//System.out.println(requete+uid);
				if (st+1<=max)st++;else return "0";
				if (temp[st].equalsIgnoreCase("-user")){
					if (st+1<=max)st++;else return "0";
					
					if (ged.rechercheUtilisateur(temp[st])|temp[st].equalsIgnoreCase("Admnistrateur"))
						return "0";
					ged.deleteUtilisateur(temp[st]);
					ged.saveToFichier();
					return "OK";
				}
				if (temp[st].equalsIgnoreCase("-doc")){
					if (st+1<=max)st++;else return "0";
					
					String [] tabtemp = ged.rechercheListUidGedClassesByUidProprietaire(uid);
					for(int i=0;i<tabtemp.length;i++){
						GedClasses gedClasseTemp = ged.getGedClasse(tabtemp[i]);
						for (int j=0; j<gedClasseTemp.getnbDocs();j++){
							if(gedClasseTemp.getGedDocs(j).getNom().equalsIgnoreCase(temp[st])){
								gedClasseTemp.deleteGedDoc(j);
								ged.saveToFichier();
								return "ok";}
						}
						
					}
						
					
					return "0";
				}
				if (temp[st].equalsIgnoreCase("-classe")){
					if (st+1<=max)st++;else return "0";
					
						GedClasses gedClasseTemp = ged.getGedClasse(temp[st]);
						if(gedClasseTemp == null || gedClasseTemp.getUidProprietaire().equalsIgnoreCase(uid)){
							 ged.deleteGedClasse(temp[st]);
							 ged.saveToFichier();
							return "ok";
						}
						
					
						
					
					return "0";
				}
				return "0";
			}
			
		}else if(temp[st].equalsIgnoreCase("add")){
			//ajout d'un element
			if (st+1<=max)st++;else return "0";	
		
			if (temp[st].equalsIgnoreCase("-uid")){
				//l'uid devient notre cookie de connexion
				//System.out.println(requete);
				if (st+1<=max)st++;else return "0";	
				uid=temp[st].toString(); //récupération de l'UID
				//System.out.println(requete+uid);
				if (st+1<=max)st++;else return "0";	
				
				if (temp[st].equalsIgnoreCase("-classe")){
					if (st+1<=max)st++;else return "0";	
					String gedClassName= temp[st];
					GedClasses gedClassesTemp = ged.getGedClassefromName(gedClassName);
					if (st+1<=max)st++;else return "0";	
					
					if (temp[st].equalsIgnoreCase("-doc")){
						if (st+1<=max)st++;else return "0";	
						String nomFichier = temp[st];
						for(int i=0;i<gedClassesTemp.getnbDocs();i++)
							if (gedClassesTemp.getGedDocs(i).getNom().equalsIgnoreCase(nomFichier)){
									return "0";}
					
						
						if (st+1<=max)st++;else return "0";	
						String ChaineB64 =temp[st];
						//if (st-max >= gedClassesTemp.getNbAttributs()*2) return "attri 0"+st+max+gedClassesTemp.getNbAttributs() ;
						if (!gedClassesTemp.createGedDoc(nomFichier,uid))return "0";
						GedDocs gedDocstemp = gedClassesTemp.getGedDocsParNom(nomFichier); //récupération du fichier créé
						for (int i =0; i<gedClassesTemp.getNbAttributs();i++){
							if (st+2<=max)st=st+2;else return "0";
							gedDocstemp.addGedAttributs(temp[st]);	
						}
						ged.base64DecodetoFile(nomFichier, ChaineB64);
						System.out.println("Fichier "+nomFichier+" à été importé");			
						ged.saveToFichier();
						return "OK";
							
					}else {
						//ajout d'une classe
						Vector<String> tempVect = new Vector<String>();
						
						
						if (ged.rechercheUidGedClasses(gedClassName)!=null) return "0";
						//if (st+1<=max)st++;else return "0"; // on arrive à -type
						for( int i=0;st+i<=max;i++){
						 		
						 		if (temp[st+i].equalsIgnoreCase("-type")){
						 			i++;
						 			tempVect.add(temp[st+i]);
						 		}else if (temp[st+i].equalsIgnoreCase("-attr")){
						 			i++;
						 			tempVect.add(temp[st+i]);
						 		}
						 }
						 	String[] tempAttri= new String[tempVect.size()];
						 	
						 	for (int i=0;i<tempVect.size();i++)
						 		tempAttri[i]= tempVect.get(i);
						 	if (ged.createGedClasses(gedClassName, uid, tempAttri))
						 		return "0";
						 	ged.saveToFichier();
						 	return "OK";
						
					}
						
					}
				}
				if (temp[st].equalsIgnoreCase("-user")){
					if (st+1<=max)st++;else return "0";
					
					if (!ged.rechercheUtilisateur(temp[st]))
						return "0";
					ged.createUtilisateur(temp[st]);
					ged.saveToFichier();
					return "OK";
						
						
				 
						
				}
			}
		
		return "0"; 
	}
	
	public boolean interrogationGed(){
		
	return true;
	}

	public synchronized  void envoiDonnees(String nomFichier){
		byte[] buffer = new byte[1024];
		
	    int bytes = 0;
	    try {
	    FileInputStream fis = new FileInputStream(ged.getRacine()+nomFichier);
	    while ((bytes = fis.read(buffer)) != -1) 	
	      out.write(buffer, 0, bytes);  		
	    	
	    fis.close();
	    out.close();
	    } catch (IOException e) {	
	    	Exec.logger.fatal("erreur envoi données",e);
		}
	}
	
}
